package com.example.micro_property_springboot.mapper;

import com.example.micro_property_springboot.pojo.AssetCheckPlan;
import com.example.micro_property_springboot.pojo.AssetCheckItem;
import com.example.micro_property_springboot.pojo.AssetCheckDiff;
import com.example.micro_property_springboot.pojo.DTO.request.AssetCheckPlanResponse;

import java.util.List;
import java.util.Map;

/**
 * 资产盘点数据访问接口
 */
public interface AssetCheckMapper {

    // ========== 盘点计划相关 ==========
    /**
     * 插入盘点计划
     * @param plan 盘点计划
     */
    void insertCheckPlan(AssetCheckPlan plan);

    /**
     * 更新盘点计划
     * @param plan 盘点计划
     */
    void updateCheckPlan(AssetCheckPlan plan);

    /**
     * 删除盘点计划
     * @param planId 计划ID
     */
    void deleteCheckPlan(Long planId);

    /**
     * 根据ID获取盘点计划
     * @param planId 计划ID
     * @return 盘点计划
     */
    AssetCheckPlan getCheckPlanById(Long planId);

    /**
     * 获取盘点计划详情
     * @param planId 计划ID
     * @return 盘点计划响应
     */
    AssetCheckPlanResponse getCheckPlanDetail(Long planId);

    /**
     * 获取盘点计划列表
     * @param params 查询参数
     * @return 盘点计划列表
     */
    List<AssetCheckPlanResponse> getCheckPlanList(Map<String, Object> params);

    // ========== 盘点项相关 ==========
    /**
     * 插入盘点项
     * @param item 盘点项
     */
    void insertCheckItem(AssetCheckItem item);

    /**
     * 更新盘点项状态
     * @param params 更新参数
     * @return 更新行数
     */
    int updateCheckItemStatus(Map<String, Object> params);

    /**
     * 根据计划ID获取盘点项列表
     * @param planId 计划ID
     * @return 盘点项列表
     */
    List<AssetCheckItem> getCheckItemsByPlanId(Long planId);

    /**
     * 获取未盘点的盘点项
     * @param planId 计划ID
     * @return 未盘点的盘点项列表
     */
    List<AssetCheckItem> getUncheckedItemsByPlanId(Long planId);

    /**
     * 根据计划ID删除盘点项
     * @param planId 计划ID
     */
    void deleteCheckItemsByPlanId(Long planId);

    // ========== 盘点差异相关 ==========
    /**
     * 插入盘点差异
     * @param diff 盘点差异
     */
    void insertCheckDiff(AssetCheckDiff diff);

    /**
     * 更新盘点差异
     * @param params 更新参数
     * @return 更新行数
     */
    int updateCheckDiff(Map<String, Object> params);

    /**
     * 根据计划ID获取盘点差异列表
     * @param planId 计划ID
     * @return 盘点差异列表
     */
    List<AssetCheckDiff> getCheckDiffsByPlanId(Long planId);

    /**
     * 根据计划ID删除盘点差异
     * @param planId 计划ID
     */
    void deleteCheckDiffsByPlanId(Long planId);

    // ========== 资产查询相关 ==========
    /**
     * 根据部门ID获取资产列表
     * @param deptId 部门ID
     * @return 资产列表
     */
    List<Map<String, Object>> getAssetsByDeptId(Long deptId);

    /**
     * 获取所有在用资产
     * @return 资产列表
     */
    List<Map<String, Object>> getAllActiveAssets();

    // ========== 统计分析相关 ==========
    /**
     * 获取总盘点资产数
     * @param planId 计划ID
     * @return 总盘点资产数
     */
    Integer getTotalCheckAssets(Long planId);

    /**
     * 获取已盘点资产数
     * @param planId 计划ID
     * @return 已盘点资产数
     */
    Integer getCheckedAssetsCount(Long planId);

    /**
     * 获取未盘点资产数
     * @param planId 计划ID
     * @return 未盘点资产数
     */
    Integer getUncheckedAssetsCount(Long planId);

    /**
     * 获取盘点差异数
     * @param planId 计划ID
     * @return 盘点差异数
     */
    Integer getDiffAssetsCount(Long planId);

    /**
     * 获取盘点完成率
     * @param planId 计划ID
     * @return 盘点完成率
     */
    Double getCheckCompletionRate(Long planId);

    /**
     * 获取部门盘点统计
     * @return 部门盘点统计
     */
    List<Map<String, Object>> getDeptCheckStatistics();

    /**
     * 获取盘点完成率趋势
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 盘点完成率趋势数据
     */
    List<Map<String, Object>> getCheckCompletionRateTrend(String startDate, String endDate);

    /**
     * 获取盘点记录报表
     * @param params 查询参数
     * @return 盘点记录报表数据
     */
    List<Map<String, Object>> getCheckRecordReport(Map<String, Object> params);
}